package controller

import (
	"fmt"
	"frontend-server/dao"
	model "frontend-server/model/gv_im"
	"frontend-server/util"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

type AuthController struct{}

type LoginPostFormSturct struct {
	Type     int    `json:"type"`
	Email    string `json:"email"`
	Phone    int    `json:"phone"`
	Password string `json:"password"`
}

// 用户登录
func (AuthController) Login(ctx *gin.Context) {
	var loginPostForm LoginPostFormSturct
	// t := ctx.PostForm("type")
	// email := ctx.PostForm("email")
	// phone := ctx.PostForm("phone")
	// password := ctx.PostForm("password")
	err := ctx.BindJSON(&loginPostForm)
	if err != nil {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数解析异常: " + err.Error(),
				// Params: gin.H{
				// 	"data": nil,
				// },
			},
		})
		return
	}
	if loginPostForm.Password == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "密码不能为空",
			},
		})
		return
	}
	if loginPostForm.Type == 1 {
		if loginPostForm.Email == "" {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "邮箱不能为空",
				},
			})
			return
		}
		user, err := dao.GetGvImUserByEmailOrPhone(loginPostForm.Email, "")
		if err != nil {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "邮箱或密码错误",
				},
			})
			return
		}
		// 邮箱登录
		if user.Email == "" {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "该邮箱未注册",
				},
			})
			return
		}
		// 验证密码
		b := util.CompareHashAndPassword(user.Password, loginPostForm.Password)
		if !b {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "邮箱或密码错误",
				},
			})
			return
		}
		//生成 token
		token, err := util.GenerateToken(user.ID, user.Username)
		if err != nil {
			util.Fail(ctx, util.R{
				P: util.P{
					Code:    500,
					Message: "系统错误: " + err.Error(),
				},
			})
			return
		}
		util.Success(ctx, util.R{
			P: util.P{
				Code:    200,
				Message: "登录成功",
				Params: gin.H{
					"data": gin.H{
						"token": token,
					},
				},
			},
		})
	} else if loginPostForm.Type == 2 {
		ctx.JSON(200, gin.H{
			"code":    "200",
			"message": loginPostForm.Phone,
		})
	} else {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数解析异常: " + err.Error(),
				// Params: gin.H{
				// 	"data": nil,
				// },
			},
		})
		return
	}
}

// 用户注册
func (AuthController) Register(ctx *gin.Context) {
	t := ctx.PostForm("type") // 1 邮箱 2 手机号
	email := ctx.PostForm("email")
	phone := ctx.PostForm("phone")
	password := ctx.PostForm("password")
	username := ctx.PostForm("username")
	code := ctx.PostForm("code")
	fmt.Println(t, email, phone, username, password)
	if t == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "注册类型不能为空",
			},
		})
		return
	}
	if email == "" || phone == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "邮箱或手机号不能为空",
			},
		})
		return
	}
	if username == "" || password == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "用户名或密码不能为空",
			},
		})
		return
	}
	if cast.ToInt(t) == 1 {
		// 验证邮箱验证码
		b, _ := util.ValidateEmailCode(code)
		fmt.Println(b)
		if !b {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "验证码错误",
				},
			})
			return
		}
		// 查询用户是否存在
		user, err := dao.GetGvImUserByEmailOrPhone(email, "")
		if err != nil {
			util.Fail(ctx, util.R{
				P: util.P{
					Code:    500,
					Message: "系统异常:" + err.Error(),
				},
			})
		}
		if user.Email != "" {
			util.Success(ctx, util.R{
				P: util.P{
					Code:    -1,
					Message: "该邮箱已注册",
				},
			})
			return
		}
		// 创建用户
		bcryptPassword, err := util.GenerateFromPassword(password)
		if err != nil {
			util.Fail(ctx, util.R{
				P: util.P{
					Code:    500,
					Message: err.Error(),
				},
			})
			return
		}
		dao.CreateGvImUser(model.GvImUser{
			Username: username,
			Email:    email,
			Phone:    cast.ToInt(phone),
			Password: bcryptPassword,
		})
		util.Success(ctx, util.R{
			P: util.P{
				Code:    200,
				Message: "注册成功",
			},
		})
		fmt.Println(b)
	}
}

// 发送验证码
func (AuthController) SendCode(ctx *gin.Context) {
	t := ctx.Query("type") // 1 邮箱 2 手机号
	email := ctx.Query("email")
	phone := ctx.Query("phone")
	fmt.Println(phone, t)
	if t == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "验证码类型不能为空",
			},
		})
		return
	}
	if cast.ToInt(t) == 1 {
		em := []string{email}
		// 发送邮箱验证码
		vCode, err := util.SendEmailValidate(em)
		if err != nil {
			util.Fail(ctx, util.R{
				P: util.P{
					Code:    500,
					Message: err.Error(),
				},
			})
			return
		}
		// 存入 redis
		err = util.SetEmailValidate(vCode)
		if err != nil {
			util.Fail(ctx, util.R{
				P: util.P{
					Code:    500,
					Message: err.Error(),
				},
			})
			return
		}
		util.Success(ctx, util.R{
			P: util.P{
				Code:    200,
				Message: "邮箱验证码发送成功",
			},
		})
	}
}
